#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <ctime>
#include<cstring>
#include <cassert>
#include <sys/stat.h>
#include <unistd.h>
// 定义一个名为 logsys 的命名空间，用于组织与日志系统相关的类和函数，避免命名冲突
namespace logsys {
    // 在 logsys 命名空间内部定义一个子命名空间 util，用于存放与日志系统相关的工具类和工具函数
    namespace util {
        // 定义一个名为 Date 的类，该类包含用于处理日期和时间的静态方法
        class Date {
        public:
            // 静态方法 now，用于获取当前的时间戳（以秒为单位）
            // time(nullptr) 调用标准库函数 time 来获取当前时间，返回值为自 1970 年 1 月 1 日以来的秒数
            // 将 time 函数的返回值强制转换为 size_t 类型并返回
            static size_t now() { 
                return (size_t)time(nullptr); 
            }
        };

        // 定义一个名为 File 的类，该类包含用于处理文件和目录操作的静态方法
        class File {
        public:
            // 静态方法 exists，用于检查指定名称的文件或目录是否存在
            // 参数 pathname 是要检查的文件或目录的名称
            // stat 函数是一个系统调用，用于获取文件或目录的状态信息
            // 如果 stat 调用成功（返回值为 0），则表示文件或目录存在，返回 true
            // 否则返回 false
            static bool exists(const std::string &pathname) {
                // 定义一个 stat 结构体变量 st，用于存储文件或目录的状态信息
                struct stat st;
                return stat(pathname.c_str(), &st) == 0;
                // 注释掉的代码使用了 access 系统调用，该调用不具备跨平台性
                // return (access(pathname.c_str(), F_OK) == 0); 
            }

            // 静态方法 path，用于从文件或目录的完整路径中提取其所在的目录路径
            // 参数 pathname 是文件或目录的完整路径
            static std::string path(const std::string &pathname) {
                // 如果传入的路径为空字符串，则返回当前目录（用 "." 表示）
                if (pathname.empty()) return ".";
                // 查找路径中最后一个路径分隔符（'/' 或 '\'）的位置
                size_t pos = pathname.find_last_of("/\\");
                // 如果没有找到路径分隔符，则返回当前目录
                if (pos == std::string::npos) return ".";
                // 提取从路径开头到最后一个路径分隔符的子字符串，即为所在的目录路径
                return pathname.substr(0, pos + 1);
            }

 // 静态函数，功能是创建目录，接受一个表示路径名的字符串引用作为参数
static void createDirectory(const std::string &pathname) {
    // 以注释形式举例说明可能传入的路径示例
    // 例如./abc/bcd/cde
    // 定义变量pos用于记录路径分隔符（'/' 或 '\'）的位置，idx用于记录当前遍历到路径字符串的位置，初始化为0
    size_t pos = 0, idx = 0;
    // 当idx小于路径字符串的长度时，循环继续，即只要还没遍历完路径字符串就一直执行循环体
    while(idx < pathname.size()) {
        // 查找从idx位置开始，路径字符串中首次出现路径分隔符（'/' 或 '\'）的位置，并将位置记录到pos中
        pos = pathname.find_first_of("\\/", idx);
        // 如果没有找到路径分隔符（find_first_of函数返回std::string::npos表示未找到）
        if (pos == std::string::npos) {
            // 此时说明已经到了路径的最后部分，直接创建整个路径对应的目录，权限设置为0777（所有者、组用户、其他用户都有读、写、执行权限）
            mkdir(pathname.c_str(), 0777);
        }
        // 截取从路径字符串开头到找到的路径分隔符位置（包含分隔符）的子字符串，作为当前要处理的父目录路径
        std::string parent_dir = pathname.substr(0, pos + 1);
        // 如果这个父目录已经存在（通过调用exists函数判断）
        if (exists(parent_dir) == true) {
            // 则将idx更新到下一个位置，跳过这个已存在的目录，继续处理后面的路径部分
            idx = pos + 1;
            continue;
        }
        // 如果父目录不存在，则创建该父目录，权限设置为0777
        mkdir(parent_dir.c_str(), 0777);
        // 将idx更新到下一个位置，继续遍历路径字符串
        idx = pos + 1;
    }
}
        };
    }
}
#endif